﻿using System;

namespace DimensionsHelper.Common.Metadata.Script;

public abstract class RangeBase
{
    protected RangeBase(int start)
    {
        Start = start;
        End = start;
    }

    /// <summary>
    ///     表达式在源字符串中的起始未知，0开始。
    /// </summary>
    public int Start { get; private set; }

    /// <summary>
    ///     表达式在源字符串中的结束位置，0开始，文本不包含此值所在未知的字符。当表达式位于字符串结尾时，此值应当是字符串长度。
    /// </summary>
    public int End { get; private set; }

    /// <summary>
    ///     当前表达式的宽度。
    /// </summary>
    public int Length => End - Start;

    /// <summary>
    ///     表达式的文本内容。
    /// </summary>
    public string Text { get; private set; } = string.Empty;

    /// <summary>
    ///     终结当前表达式并更新结束位置和表达式文本。
    /// </summary>
    /// <param name="end">表达式结束位置，文本不包含此位置字符</param>
    /// <param name="text">表达式文本</param>
    /// <exception cref="Exception"></exception>
    public virtual void Finish(int end, string text)
    {
        if (end <= Start)
        {
            throw new Exception("`Expression.Finish`: 给定结束未知小于等于起始位置。");
        }

        End = end;
        Text = text;
    }

    /// <summary>
    ///     终结当前表达式并更新起始位置和表达式文本。
    /// </summary>
    /// <param name="start"></param>
    /// <param name="end"></param>
    /// <param name="text"></param>
    public void Finish(int start, int end, string text)
    {
        Start = start;
        Finish(end, text);
    }
}